--[[ 编码: JX-24-16 名称: 出库单-拣料箱绑定界面-确定 作者: 日期:2025-1-29 函数: main 功能: -- 创建出库波次,把拣货箱绑定到 出库单 更改记录: V2.0 HAN 20241024 参数改成从 m3.GetSysInputParameter( strLuaDEID ) 获取 一个出库单也形成出库波次 V3.0 HAN 20241026 触发一个后台 WFP 进行配盘操作 --]] wms_base = require ("wms_base") function main( strLuaDEID ) local nRet, strRetInfo local parameter nRet, parameter = m3.GetSysInputParameter( strLuaDEID ) if ( nRet ~= 0 ) then lua.Error( strLuaDEID, debug.getinfo(1), "m3.GetSysInputParameter 失败! "..parameter ) end lua.Debug( strLuaDEID, debug.getinfo(1), "parameter", parameter ) local total_qty = 0 -- 货品种类 local ipa_item_list = {} -- 预分配库存时用到 local sum_detail_list = parameter.o_detail_list local bWave = false local compose = parameter.wave_compose local wh_code = parameter.wh_code local area_code = parameter.area_code local station = parameter.station local exit_loc = parameter.exit_loc local login = parameter.login local user_name = parameter.user_name local nCount = #compose nRet, strRetInfo = mobox.getCurEditDataObjAttr( strLuaDEID, "PickingBoxCode", "PickingBoxNum" ) local input_value = json.decode( strRetInfo ) local picking_box_codes = lua.Get_StrAttrValue( input_value[1].value ) if ( picking_box_codes == '' ) then mobox.stopProgram( strLuaDEID, "必须绑定拣料箱!") return end -- 拣料箱数量 local picking_box_num = lua.Get_NumAttrValue( input_value[2].value ) if ( picking_box_num <= 0 ) then mobox.stopProgram( strLuaDEID, "拣料箱数量不合法!") return end local pick_box_code_array = lua.split( picking_box_codes, ";" ) if ( #pick_box_code_array ~= picking_box_num ) then mobox.stopProgram( strLuaDEID, "绑定的拣料箱数量必须="..picking_box_num) return end local good_type_num = #sum_detail_list -- 【step1】 申请分配量,判断库存量是否够出库 for n = 1, good_type_num do local ipa_item = { N_ROW_NO = n, S_ITEM_CODE = sum_detail_list[n].item_code, S_ITEM_NAME = sum_detail_list[n].item_name, F_QTY = sum_detail_list[n].qty } table.insert( ipa_item_list, ipa_item ) end -- IPA 库存量分配开始 nRet, strRetInfo = wms.wms_IPA_Start( wh_code, "", lua.table2str(ipa_item_list) ) if ( nRet ~= 0 ) then lua.Error( strLuaDEID, debug.getinfo(1), "wms_IPA_Start 失败!"..strRetInfo ) end local success, ret_info success, ret_info = pcall( json.decode, strRetInfo ) if ( success == false ) then mobox.setInfo( strLuaDEID, "wms_IPA_Start 返回值不正确! --> "..strRetInfo ) return end if ( ret_info.trans_id == "" ) then -- 缺件 -- 这里加一个HTML弹框 mobox.setInfo( strLuaDEID, "缺件! --> "..lua.table2str( ret_info.oos_info ) ) return end local ipa_transid = ret_info.trans_id -- 【step2】 初始化出库货品清单 item_list local item_list = {} local obj_attrs -- 生成要出库的货品链表 item_list for n = 1, good_type_num do local item = { item_code = sum_detail_list[n].item_code, item_name = sum_detail_list[n].item_name, volume = sum_detail_list[n].volume, weight = sum_detail_list[n].weight, cell_type = sum_detail_list[n].cell_type, qty = sum_detail_list[n].qty, alloc_qty = 0, cntr_cell_list = {}, ok = false -- true 表示这个货品已经配完货 } table.insert( item_list, item ) end -- 【step3】 如果是波次出库,系统生成出库波次对象(需要用波次号区锁定容器) local strUpdateSql local oo_no_set = {} local wave_detail local wave -- 创建出库波次 wave = m3.AllocObject(strLuaDEID,"Outbound_Wave") wave.wh_code = wh_code wave.area_code = area_code wave.station = station wave.operator_name = user_name wave.operator = login wave.good_type_num = parameter.good_type_num wave.total_qty = parameter.total_qty wave.picking_box_num = parameter.picking_box_num nRet, wave = m3.CreateDataObj( strLuaDEID, wave ) if ( nRet ~= 0 ) then wms.wms_IPA_Abort( ipa_transid ) lua.Error( strLuaDEID, debug.getinfo(1), '创建【出库波次】对象失败!'..wave ) end -- 创建出库波次组成 local nCurCodeIndex = 1 -- 拣料箱编码游标 local pick_box_code local m local pickbox_index = 1 -- compose 是组成波次的出库单的一些基础信息 -- nCount 出库单数量,创建波次组成 for n = 1, nCount do table.insert( oo_no_set, compose[n].oo_no ) local ow_compose = m3.AllocObject(strLuaDEID,"OW_Compose") ow_compose.oo_no = compose[n].oo_no ow_compose.wave_no = wave.wave_no nRet, strRetInfo = m3.CreateDataObj( strLuaDEID, ow_compose ) if ( nRet ~= 0 ) then wms.wms_IPA_Abort( ipa_transid ) lua.Error( strLuaDEID, debug.getinfo(1), '创建【出库波次组成】对象失败!'..strRetInfo ) end -- 获取和该出库单进行绑定的拣料箱编码 pick_box_code = '' for m = 1, compose[n].pick_box_num do if (pick_box_code ~= '') then pick_box_code = pick_box_code..";" end pick_box_code = pick_box_code..pick_box_code_array[pickbox_index] pickbox_index = pickbox_index + 1 end strUpdateSql = "S_WAVE_NO = '"..wave.wave_no.."', S_STATION_NO = '"..wave.station.."', S_OPERATOR_NAME = '"..wave.operator_name.."'," -- 更新【出库单】状态, 并且把拣料箱绑定 -- N_B_STATE = 1 表示出库单已经配货 strUpdateSql = strUpdateSql.."S_OPERATOR = '"..wave.operator.."', N_B_STATE = 1, S_PICK_BOX_CODE = '"..pick_box_code.."'" strCondition = "S_NO = '"..compose[n].oo_no.."'" nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Outbound_Order", strCondition, strUpdateSql ) if ( nRet ~= 0 ) then wms.wms_IPA_Abort( ipa_transid ) lua.Error( strLuaDEID, debug.getinfo(1), "更新【出库单】信息失败!"..strRetInfo ) end end -- 创建出库波次明细 for n = 1, #sum_detail_list do wave_detail = m3.AllocObject(strLuaDEID,"OW_Detail") wave_detail.wave_no = wave.wave_no wave_detail.row_no = n wave_detail.item_code = sum_detail_list[n].item_code wave_detail.item_name = sum_detail_list[n].item_name wave_detail.qty = sum_detail_list[n].qty wave_detail.weight = sum_detail_list[n].weight wave_detail.volume = sum_detail_list[n].volume nRet, strRetInfo = m3.CreateDataObj( strLuaDEID, wave_detail ) if ( nRet ~= 0 ) then wms.wms_IPA_Abort( ipa_transid ) lua.Error( strLuaDEID, debug.getinfo(1), '创建【出库波次明细】对象失败!'..strRetInfo ) end end -- 需要清空 拣料箱中的货品明细 CG_Detail local in_cntr_code = '' for n = 1, #pick_box_code_array do in_cntr_code = in_cntr_code.."'"..pick_box_code_array[n].."'," end in_cntr_code = lua.trim_laster_char( in_cntr_code ) -- 取消最后一个,号 strCondition = "S_CNTR_CODE IN ("..in_cntr_code..")" lua.Debug( strLuaDEID, debug.getinfo(1), "清除拣料箱CG_Detail--->", strCondition ) nRet, strRetInfo = mobox.dbdeleteData(strLuaDEID, "CG_Detail", strCondition) if (nRet ~= 0) then lua.Error( strLuaDEID, debug.getinfo(1), "删除【CG_Detail】失败!"..strRetInfo) end -- 新增一个后台处理,让后台程序进行自动配盘 local add_wfp = { wfp_type = 1, -- 触发数据对象事件(指定数据对象标识) cls = "Outbound_Wave", obj_id = wave.id, obj_name = "波次号'"..wave.wave_no.."'-->自动配盘", trigger_event = "自动配盘" } nRet, strRetInfo = m3.AddSysWFP( strLuaDEID, add_wfp ) if ( nRet ~= 0 ) then wms.wms_IPA_Abort( ipa_transid ) lua.Error( strLuaDEID, debug.getinfo(1), strRetInfo ) end wms.wms_IPA_Commit( ipa_transid ) local action = { { action_type = "close_dlg", value = "" }, { action_type = "refresh", value = "" } } nRet, strRetInfo = mobox.setAction( strLuaDEID, lua.table2str(action) ) if ( nRet ~= 0 ) then lua.Error( strLuaDEID, debug.getinfo(1), "setAction失败! "..strRetInfo..' action = '..strAction ) end end